import base64
import csv
import json
import os

import redis


def main():
    # 指定Redis数据库信息
    redis_cli = redis.StrictRedis(host='127.0.0.1', port=6379, db=5)

    # 判断是否存在download文件夹，如果没有则创建
    download_path = os.getcwd() + '/download/'  # 当前文件夹下的download文件夹
    if not os.path.exists(download_path):  # 判断文件夹或文件
        os.makedirs(download_path)

    while True:
        # FIFO模式为 blpop，LIFO模式为 brpop，获取键值
        source, data = redis_cli.blpop(["top250:items"])

        item = json.loads(data.decode())  # data.decode()目的，因为从Redis中提取到的数据时byte类型，所以转换为字符串类型

        msg_type = item.get("type")
        if msg_type == "info":
            # # 信息
            # {
            #     "type": "info",
            #     "img_src": img_src,
            #     "title": title,
            #     "rating_num": rating_num,
            #     "people_num": people_num
            # }
            # 如果是信息，就保存到csv文件
            with open(download_path + '豆瓣电影TOP250.csv', 'a') as f:
                # 创建一个csv的DictWriter对象，这样才能够将写入csv格式数据到这个文件
                f_csv = csv.DictWriter(f, ['title', 'img_src', 'rating_num', 'people_num'])
                # 写入多行行（当做数据）
                item.pop("type")  # 删除type 这个key-value
                f_csv.writerows([item])
                print("保存信息到CSV....ok")

        elif msg_type == "img":
            # 存储图片
            with open(download_path + item.get("img_name"), "wb") as f:
                img_data = base64.b64decode(item.get("img_bytes"))
                f.write(img_data)
                print("保存图片ok....")


if __name__ == '__main__':
    main()
